package com.hyt.it.ogt.kq.service.gov.examsystem;

import com.hyt.it.ogt.kq.service.gov.model.param.OumaParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 考试系统接口
 * </p>
 *
 * @author huangyh
 * @since 2021-07-19
 */
public interface ExamSystem {

    /**
     * 通过考点或考场编码查询考点或考场注册信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考点或考场注册信息
     */
    String getRegisterInfo(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 注册考场信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 注册状态
     */
    String newRegisterRoom(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 注册考场信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 注册结果
     * @throws Exception 异常
     */
    String registerRoom(HttpServletRequest request, HttpServletResponse response, String taskCode) throws Exception;

    /**
     * 获取已启用的考试项目列表
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 已启用的考试项目列表
     */
    String getExamTaskList(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取考场考务数据包
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考务包信息
     */
    String getRoomPackage(HttpServletRequest request, HttpServletResponse response, String taskCode) throws Exception;

    /**
     * 考务包下载成功后更新考务包下载状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updateRoomPackageState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取试卷包
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 试卷包下载信息
     */
    String getPaperData(HttpServletRequest request, HttpServletResponse response, String taskCode) ;

    /**
     * 试卷包下载成功后更新试卷包下载状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updatePaperDataState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取试卷授权码
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 试卷授权码信息
     */
    String getPaperAuthorizationCode(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取试卷授权码成功后通知考务更新试卷授权码状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updatePaperAuthorizationCodeState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 上传模拟测试报告
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 上传结果
     */
    String uploadTestReport(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 同步考试数据包
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 同步考试数据包信息数据
     */
    String examPackageSync(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 上传封场信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 上传结果
     */
    String updateClosure(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取上传监考机配置备份信息地址
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 上传监考机配置备份信息地址
     */
    String getMonitorSettingBackupPath(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 更新上传监考端配置备份信息状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新状态结果
     */
    String updateMonitorSettingBackupState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 下载监考端配置备份信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 下载监考端配置备份信息路径
     */
    String getMonitorSettingBackup(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 更新下载监考端配置备份信息状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新下载监考端配置备份信息状态
     */
    String updateMonitorSettingBackupDownloadState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 下载基础包
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 基础包下载信息
     */
    String getBasePackage(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 更新基础包文件下载状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updateBaseDataState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取已启用的考试项目编号
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考试项目编号信息
     */
    String getTaskCode(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取考场重考考务数据包
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考场重考考务数据包
     */
    String getResitRoomPackage(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 重考考务包下载成功后更新重考考务包下载状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updateResitRoomPackageState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 测试考试系统能否正常连接考务系统
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 测试结果
     */
    String checkExamSystemConnection(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取服务器时间
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 服务器时间
     */
    String getServerTime(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取考生信息(在线添加考生)
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考生信息
     * @throws Exception 异常
     */
    String getCandidateInfo(HttpServletRequest request, HttpServletResponse response, String taskCode) throws Exception;

    /**
     * 校验是否可以上传考试结果，并获取上传路径
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 校验结果和上传路径
     */
    String getResultUploadPath(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 校验考试结果是否上传成功
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 校验结果
     */
    String verifyResult(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 上传考试结果成功后通知考务更新上传状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新结果
     */
    String updateResultState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 上报考场考试过程操作数据状态
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 上报结果
     */
    String updateExamMonitor(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 根据考点编号得到其下的考试批次及考场信息
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 考试批次及考场信息
     */
    String getTimeByPlace(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 下载测试项清单
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 测试项清单数据
     */
    String getTestInventory(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 更新下载模拟测试项清单结果
     * @param request 请求
     * @param response 响应
     * @param taskCode 考试任务编号
     * @return 更新下载模拟测试项清单结果
     */
    String updateTestInventoryState(HttpServletRequest request, HttpServletResponse response, String taskCode);

    /**
     * 获取华为云OBS信息
     * @return 华为云OBS信息
     */
    String getHuaweiCloudObsInfo();

    /**
     * 获取山大欧玛接口配置参数
     * @param oumaParam 山大欧玛请求参数对象
     * @return 山大欧玛接口配置参数
     */
    String getOumaExaminationConfig(OumaParam oumaParam);

    /**
     * 考试文件包上传
     * @param timestamp 时间戳
     * @param request 请求
     * @param response 响应
     * @param file 文件
     * @param taskCode 考试任务编号
     * @param type 文件类型
     * @return 上传结果
     */
    String upload(long timestamp, HttpServletRequest request, HttpServletResponse response,
                  MultipartFile file, String taskCode, String type, String roomCode);

    String postBehaviorAnalysis(HttpServletRequest request, HttpServletResponse response, String taskCode);

    String updateBackUpState(HttpServletRequest request, HttpServletResponse response, String taskCode);

}
